#include "Thread.hpp"
#include <unordered_map>
#include <memory>

using thread_ptr_t = std::shared_ptr<ThreadModule::Thread<int>>;

#define NUM 10

class threadData
{
public:
    int max;
    int start;
};

void Count(threadData td)
{
    for(int i = td.start; i < td.max; i++)
    {
        std::cout<< "i == " <<i <<std::endl;
        sleep(1);
    }
}


int main()
{
    // threadData td;
    // td.max = 60;
    // td.start = 50;

    // //使用lamda表达式封装Count成一个不接受参数的可调用对象
    // auto func = [td]()
    // {
    //     Count(td);
    // };

    // ThreadModule::Thread<threadData> t(func);

    // t.Start();

    // t.Join();


    // //先描述再组织
    // std::unordered_map<std::string, thread_ptr_t> threads;
    // //如果我们要创建多线程呢？
    // for(int i = 0; i< NUM ; i++)
    // {
    //     auto func = []()
    //     {
    //         while(true)
    //         {
    //             std::cout<< "hello world" << std::endl;
    //             sleep(1);
    //         }
    //     };

    //     int threadData = i+1; 

    //     thread_ptr_t t= std::make_shared<ThreadModule::Thread<int>>(
    //         [func](int)
    //         {
    //             func();
    //         }, 
    //         threadData
    //         );
        
    //     std::cout<< "Create thread with name : "<<t->Name() <<std::endl;
        
    //     threads[t->Name()] = t;
    // }

    // for(auto &thread : threads)
    // {
    //     thread.second->Start();
    // }

    // for(auto &thread : threads)
    // {
    //     thread.second->Join();
    // }


    auto func = []()
    {
        while(true)
        {
            std::cout<< "hello world" <<std::endl;
            sleep(1);
        }
    };

    std::function<void(int)> wrappedFunc2 = [func](int){ func(); };
    int signalTreadData = 5;
    ThreadModule::Thread<int> t( wrappedFunc2,
        signalTreadData);

    // std::cout<< "Create thread with name : "<<t->Name() <<std::endl;

    // t.Start();
    // t.Join();

    t.Start();
    std::cout<< t.Name() << " is running" <<std::endl;
    std::cout<<std::flush;//手动刷新缓冲期

    sleep(5);

    if (t.Stop()) {
        std::cout << "Stop thread : " << t.Name() << std::endl;
        std::cout << std::flush; // 手动刷新缓冲区
    } else {
        std::cout << "Failed to stop thread : " << t.Name() << std::endl;
        std::cout << std::flush; // 手动刷新缓冲区
    }

    sleep(1);

    if (t.Join()) {
        std::cout << "Join thread : " << t.Name() << std::endl;
        std::cout << std::flush; // 手动刷新缓冲区
    } else {
        std::cout << "Failed to join thread : " << t.Name() << std::endl;
        std::cout << std::flush; // 手动刷新缓冲区
    }

    return 0;
}